home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
libs
/
ctask22d
/
tskmsg.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-05-17
|
3KB
|
161 lines
/*
--- Version 2.2 91-05-17 00:02 ---
TSKMSG.C - CTask - Message handling routines.
Public Domain Software written by
Thomas Wagner
Ferrari electronic Gmbh
Beusselstrasse 27
D-1000 Berlin 21
Germany
*/
#include "tsk.h"
#include "tsklocal.h"
/*
create_mailbox - initialises mailbox.
*/
mailboxptr Globalfunc create_mailbox (mailboxptr box TN(byteptr name))
{
#if (TSK_DYNAMIC)
if (box == LNULL)
{
if ((box = (mailboxptr)tsk_palloc (sizeof (mailbox))) == LNULL)
return LNULL;
box->flags = F_TEMP;
}
else
box->flags = 0;
#endif
tsk_init_qhead (&box->waiting, TYP_MAILBOX);
box->mail_first = box->mail_last = LNULL;
#if (TSK_NAMED)
tsk_add_name (&box->name, name, TYP_MAILBOX, box);
#endif
return box;
}
/*
delete_mailbox - kills all processes waiting for mail
*/
void Globalfunc delete_mailbox (mailboxptr box)
{
CRITICAL;
CHECK_EVTPTR (box, TYP_MAILBOX, "Delete Mailbox");
C_ENTER;
tsk_kill_queue (&(box->waiting));
box->mail_first = box->mail_last = LNULL;
C_LEAVE;
#if (TSK_NAMED)
tsk_del_name (&box->name);
#endif
#if (TSK_DYNAMIC)
if (box->flags & F_TEMP)
tsk_pfree (box);
#endif
}
/*
wait_mail - Wait until mail arrives. If there is mail in the box on
entry, the first mail block is assigned to the caller,
and the task continues to run.
*/
farptr Globalfunc wait_mail (mailboxptr box, dword timeout)
{
msgptr msg;
CRITICAL;
CHECK_EVTPTR (box, TYP_MAILBOX, "Wait Mail");
C_ENTER;
if ((msg = box->mail_first) != LNULL)
{
if ((box->mail_first = msg->next) == LNULL)
box->mail_last = LNULL;
C_LEAVE;
return msg;
}
tsk_wait (&box->waiting, timeout);
return GLOBDATA current_task->retptr;
}
/*
c_wait_mail - If there is mail in the box on entry, the first mail
block is assigned to the caller, else an error is returned.
*/
farptr Globalfunc c_wait_mail (mailboxptr box)
{
msgptr msg;
CRITICAL;
CHECK_EVTPTR (box, TYP_MAILBOX, "Cond Wait Mail");
C_ENTER;
if ((msg = box->mail_first) != LNULL)
if ((box->mail_first = msg->next) == LNULL)
box->mail_last = LNULL;
C_LEAVE;
return msg;
}
/*
send_mail - Send a mail block to a mailbox. If there are tasks waiting
for mail, the first waiting task is assigned the block and
is made eligible.
*/
void Globalfunc send_mail (mailboxptr box, farptr msg)
{
tcbptr curr;
CRITICAL;
CHECK_EVTPTR (box, TYP_MAILBOX, "Send Mail");
C_ENTER;
if ((curr = (tcbptr)box->waiting.first)->cqueue.kind & Q_HEAD)
{
if (box->mail_first == LNULL)
box->mail_first = (msgptr)msg;
else
box->mail_last->next = (msgptr)msg;
((msgptr)msg)->next = LNULL;
box->mail_last = (msgptr)msg;
C_LEAVE;
return;
}
tsk_runable (curr);
curr->retptr = msg;
C_LEAVE;
}
/*
check_mailbox - returns TRUE if there is mail in the box.
*/
int Globalfunc check_mailbox (mailboxptr box)
{
CHECK_EVTPTR (box, TYP_MAILBOX, "Check Mailbox");
return box->mail_first != LNULL;
}